//*********************************************************************************
//模块名称：		crc32_d8_01	
//模块用途：		CRC32并行8bit处理基本模块
//版本记录：
//v0.10		2011/10/05	邵寅亮

//*********************************************************************************
`timescale	1ps/1ps
module phy_crc32_d8_01(
		input	wire		sclk,
		
		input	wire		crc_en,
		input	wire		data_en,
		input	wire		invert_en,
		input	wire	[7:0]	din,

		output	reg	[31:0]	crc32_value,
		
		output	wire	[7:0]	tout
		);
		
//******************************************************************/
//			   参数定义
//******************************************************************/
parameter	Verify_Mode=0;

//******************************************************************/
//			   信号定义
//******************************************************************/
reg	[7:0]	d;
wire	[31:0]	c;

//**********************************************************************/
//			CRC计算
//**********************************************************************/

always @(invert_en or din)
	if (invert_en==1)
		d<=~din;
	else
		d<=din;

assign c = crc32_value;

always @(posedge sclk)
	if(data_en==1) begin
		if(crc_en==1) begin
			crc32_value[31] <= c[29]^c[23];
			crc32_value[30] <= c[31]^c[28]^c[22];
			crc32_value[29] <= c[31]^c[30]^c[27]^c[21];
			crc32_value[28] <= c[30]^c[29]^c[26]^c[20];
			crc32_value[27] <= c[31]^c[29]^c[28]^c[25]^c[19];
			crc32_value[26] <= c[30]^c[28]^c[27]^c[24]^c[18];
			crc32_value[25] <= c[27]^c[26]^c[17];
			crc32_value[24] <= c[31]^c[26]^c[25]^c[16];
			crc32_value[23] <= c[30]^c[25]^c[24]^c[15];
			crc32_value[22] <= c[24]^c[14];
			crc32_value[21] <= c[29]^c[13];
			crc32_value[20] <= c[28]^c[12];
			crc32_value[19] <= c[31]^c[27]^c[11];
			crc32_value[18] <= c[31]^c[30]^c[26]^c[10];
			crc32_value[17] <= c[30]^c[29]^c[25]^c[9];
			crc32_value[16] <= c[29]^c[28]^c[24]^c[8];
			crc32_value[15] <= c[31]^c[29]^c[28]^c[27]^c[7];
			crc32_value[14] <= c[31]^c[30]^c[28]^c[27]^c[26]^c[6];
			crc32_value[13] <= c[31]^c[30]^c[29]^c[27]^c[26]^c[25]^c[5];
			crc32_value[12] <= c[30]^c[29]^c[28]^c[26]^c[25]^c[24]^c[4];
			crc32_value[11] <= c[28]^c[27]^c[25]^c[24]^c[3];
			crc32_value[10] <= c[29]^c[27]^c[26]^c[24]^c[2];
			crc32_value[9]  <= c[29]^c[28]^c[26]^c[25]^c[1];
			crc32_value[8]  <= c[28]^c[27]^c[25]^c[24]^c[0];
			
			crc32_value[7]  <= c[31]^c[29]^c[27]^c[26]^c[24]^d[0];
			crc32_value[6]  <= c[31]^c[30]^c[29]^c[28]^c[26]^c[25]^d[1];
			crc32_value[5]  <= c[31]^c[30]^c[29]^c[28]^c[27]^c[25]^c[24]^d[2];
			crc32_value[4]  <= c[30]^c[28]^c[27]^c[26]^c[24]^d[3];
			crc32_value[3]  <= c[31]^c[27]^c[26]^c[25]^d[4];
			crc32_value[2]  <= c[31]^c[30]^c[26]^c[25]^c[24]^d[5];
			crc32_value[1]  <= c[31]^c[30]^c[25]^c[24]^d[6];
			crc32_value[0]  <= c[30]^c[24]^d[7];
			end
		else if (Verify_Mode==0)
			crc32_value<={crc32_value[23:0],8'h00};
		else
			crc32_value<=0;
	end

endmodule